/*****************************************************************************/
function GenericModel(h,modelname,site)
{
//	this.Init();
}

/*****************************************************************************/
GenericModel.prototype.PreInit=function(site,modelname,h,isFromObject)
{
	for (var i in h) this[i]=h[i];
	this.ModelName=modelname;
	this.Site=site;
}

/*****************************************************************************/
GenericModel.prototype.InitFileGroupId=function(colname)
{

}

/*****************************************************************************/
GenericModel.prototype.UpdateFromObject=function(h)
{
	for (var k in h) this[k]=h[k];
	this.InitAuto(true,h);
	this.Init(true,h);
}

/*****************************************************************************/
GenericModel.prototype.PackPgArray=function(name)
{
//	if (this.
}

/*****************************************************************************/
GenericModel.prototype.UnpackPgArray=function(name)
{
	this[name+"_i18n_orig"]=this[name];
	var f=this[name];
	if (!f.match(/^\{/)) return;
	f=f.replace(/^\{/,"").replace(/\}$/,",");
	var arr;
	arr=f.match(/^(?:(NULL|[^"]+|"(?:[^"]+|(?:\\.)+)*"),)+$/);
	var l=[];
	l.push(null);
	this[name+"_i18n"]=l;
	var nn=-1;
//	throw "f="+f;
	throw "arr=['"+arr.join("','")+"']";
//	throw "l=["+l.join(",")+"]";
	for (var i=1;i<arr.length;i++) {
		if (arr[i]=="NULL") {
			l.push(null);
		} else if (arr[i].match(/^"/)) {
			var r=arr[i].replace(/\\(.)/g,function(p,p1) {
					switch(p1) {
						case "n": return "\n";
						case "t": return "\t";
						case "r": return "\r";
					}
					return p1;
			} );
			l.push(r);
			if (nn==-1) l=i;
		} else {
			l.push(arr[i]);
			if (nn==-1) l=i;
		}
	}
	this[name]=l[this.Site.lang_id||1]||l[1]||l[nn];
	throw "l="+l;
}

/*****************************************************************************/
GenericModel.prototype.EmuSpace=function()
{
	return {
		site:this.Site,
		functions:this.Site.refs.functions,
		system:this.Site.system
	};
}

/*****************************************************************************/
GenericModel.prototype.InitFileId=function(colname) {
	if (!this[colname]) {
		this[colname+"_name_or_filename"]="";
		this[colname+"_name"]="";
		return;
	}
	this[colname+"_url"]=this.Site.refs.functions.file_group_path(this.EmuSpace(),this[colname+"_file_group_id"])+this[colname]+"."+this[colname+"_ext"];
	this[colname+"_name_or_filename"]=this[colname+"_name"]||this[colname+"_orig_filename"];
	if (this[colname+"_name"]==undefined || this[colname+"_name"]==null) this[colname+"_name"]="";
}

/*****************************************************************************/
GenericModel.prototype.CachedFileGroupFirstFile=function(colname) {
	if (!this[colname]) return null;
	var path=this.Site.refs.functions.file_group_path(this.EmuSpace(),this[colname]);
	var ffile=this["Cached_FF_"+colname]=this.Site.sql.execute_and_fetch_one("files/list",{file_group_id:this[colname]},{});
	ffile.url=path+ffile.id+'.'+ffile.ext;
	return this["Cached_FF_"+colname];
}

/*****************************************************************************/
GenericModel.prototype.CachedFileGroup=function(colname) {
	if (!this[colname]) return [];
	if (this["Cached_"+colname]) return this["Cached_"+colname];
	this["Cached_"+colname]=this.Site.sql.execute_and_fetch('files/list',{file_group_id:this[colname]},{});
	var path=this.Site.refs.functions.file_group_path(this.EmuSpace(),this[colname]);
	this["Cached_"+colname].forEach(function(x) {x.url=path+x.id+'.'+x.ext;});
	return this["Cached_"+colname];
}

/*****************************************************************************/
GenericModel.prototype.Init=function(isFromObject,object) {
}

/*****************************************************************************/
GenericModel.prototype.Save_After=function() {
}

/*****************************************************************************/
GenericModel.prototype.InitAuto=function(isFromObject,object) {
}

/*****************************************************************************/
GenericModel.prototype.Apply=function(h,mname,site) {
	for (var i in h) this[i]=h[i];
	this.ModelName=mname;
	this.Site=site;
}

/*****************************************************************************/
GenericModel.prototype.Data=function() {
	var r={};
	for (var k in this) {
		var v=this[k];
		if (v==undefined || v==null) r[k]=v;
		if (typeof v == "object") continue;
		if (typeof v == "function") continue;
		r[k]=v;
	}
	return r;
}

/*****************************************************************************/
GenericModel.prototype.Save=function() {
	if (this.id) {
		this.Site.sql.execute("_models/"+this.ModelName+"/update",this.Data(),{});
	} else {
		this.Site.sql.execute("_models/"+this.ModelName+"/insert",this.Data(),{});
		this.id=this.Site.sql.execute_and_fetch_one("_models/"+this.ModelName+"/maxid").id;
	}
	this.Save_After();
	return this;
}

/*****************************************************************************/
GenericModel.prototype.Remove=function() {
	this.Site.sql.execute("_models/"+this.ModelName+"/delete",this,{});
}

/*****************************************************************************/
GenericModel.prototype.MakeZeroes=function(arr) {
	for (var i=0;i<arr.length;i++) if (!this[arr[i]]) this[arr[i]]=0;
}

/*****************************************************************************/
GenericModel.prototype.Children=function() {
	if (this.ChildrenCached) return this.ChildrenCached;
}

/*****************************************************************************/
GenericModel.prototype.toJSON_After=function(ret) {
}

/*****************************************************************************/
GenericModel.prototype.toJSON=function() {
	var t=this;
	var ret={};
	this.toJSONlist.forEach(function(i) {ret[i]=t[i];});
	this.toJSON_After(ret);
	return ret;
}


/*****************************************************************************/
/*Array.prototype.recurse_iterator=function(data,func,level) {
	if (!level) level=1;
	for (var i=0;i!=this.length;i++) {
		func(data,level,this[i]);
		if (!this[i].Children) continue;
		var arr=this[i].Children();
		if (!arr) continue;
		arr.recurse_iterator(data,func,level+1);
	}
}*/

/*****************************************************************************/
exports.GenericModel=GenericModel;

/*****************************************************************************/
